package com.arpa.wms.mapper;

import com.arpa.wms.domain.dto.OutboundDTO;
import com.arpa.wms.domain.dto.OutboundRegisterDTO;
import com.arpa.wms.domain.dto.RecheckOperationDto;
import com.arpa.wms.domain.entity.Outbound;
import com.arpa.wms.domain.vo.OutboundVO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 出库单 Mapper 接口
 * </p>
 *
 * @author LEO
 * @since 2020-08-07
 */
public interface OutboundMapper extends BaseMapper<Outbound> {

    /**
     * 查询列表
     * @param outboundDTO
     * @return
     */
    List<OutboundVO> queryList(OutboundDTO outboundDTO);

    /**
     * 查询合计,包含总数
     * @param sql
     * @return
     */
    OutboundVO queryListSum(@Param("sql") String sql);

    /**
     * 查询合计,包含总数
     * @param outboundDTO
     * @return
     */
    OutboundVO queryListTotal(OutboundDTO outboundDTO);

    /**
     * @description
     * 根据总复核量+总退减量 与 计划复核量的比较，尝试更新出库单状态
     * @author xuyang
     * @date 2020/10/29 9:10
     * @param outboundCode:
     * @param status:
     **/
    int updateStatusIfFinishRecheck(@Param("code") String outboundCode, @Param("status") String status,@Param("groupCode") String groupCode);

    /**
     * 首页出库统计
     * @param warehouseCodes 仓库标识
     * @param shipmentCodes 货主标识 @link {java.util.List}
     *
     * @param groupCode
     * @return
     */
    List<Map<String, Object>> outboundCount(@Param("warehouseCodes") List<String> warehouseCodes,@Param("shipmentCodes") List<String> shipmentCodes, @Param("groupCode") String groupCode);

    /**
     * 根据出库单明细更新出库单出库数量
     * @param code
     * @return
     */
    int updateOutQuantityByItems(@Param("outboundCode") String code, @Param("groupCode") String groupCode);

    /**
     * 根据订单更新出库单出库数量
     * @param code
     * @return
     */
    int updateOutQuantityByDelivery(@Param("outboundCode") String code, @Param("groupCode") String groupCode);

    /**
     * 根据出库数量更新出库单状态
     * @param code
     * @param unDeliveryStatus
     * @param partDeliveryStatus
     * @param deliveryedStatus
     * @return
     */
    int updateStatusForOutCheck(@Param("outboundCode") String code, @Param("status1") String unDeliveryStatus,
                                @Param("status2") String partDeliveryStatus, @Param("status3") String deliveryedStatus,
                                @Param("groupCode") String groupCode);


    /**
     * 普通复核更新复核数量
     * @author liuxr
     * @date 2021/4/12 18:45
     * @param code 出库单号
     * @param reviewCount 复核数量
     * @param finishCount 完成复核订单数
     * @return int 更新条数
     */
    int generalReviewUpdateInfo(@Param("code") String code,@Param("reviewCount")  BigDecimal reviewCount,
                                @Param("finishCount") int finishCount, @Param("groupCode") String groupCode);

    /**
     * 普通复核更新复核数量
     * @author liuxr
     * @date 2021/4/12 18:45
     * @param deliveryCode 发货单号
     * @param reviewCount 复核数量
     * @return int 更新条数
     */
    int generalReviewUpdateInfoByDeliveryCode(@Param("deliveryCode") String deliveryCode,@Param("reviewCount")  BigDecimal reviewCount,
                                               @Param("groupCode") String groupCode);

    /**
     * 查询各订单标识对应的任务数量
     */
    List<OutboundVO> queryTaskQuantityGroupByOrderTag(@Param("groupCode") String groupCode);

    /**
     * 出库确认更新出库单状态
     * @author liuxr
     * @date 2021/4/23 18:00
     * @param code 出库单号
     * @param status 出库单状态
     */
    void updateStatusForConfirmDelivery(@Param("code") String code,@Param("status") String status,@Param("groupCode") String groupCode);

    /**
     * 根据波次内出库完成的订单出库数量更新出库单出库数量
     * @author liuxr
     * @date 2021/4/24 12:13
     * @param code 出库单号
     */
    void updateOutQuantity(@Param("outboundCode") String code,@Param("groupCode") String groupCode);

    /**
     * 根据出库明细的复核数量更新出库表的复核数量和状态
     * @author rfwang
     * @date 2021/5/21 12:13
     * @param outboundCode 出库单号
     */
    int updateRecheckQuantity(@Param("outboundCode") String outboundCode,@Param("groupCode") String groupCode);

    /**
     * 波次拣货确认，不需要复核操作时，自动更新出库单复核数量及状态
     *
     * @param wavePickingCode 波次号
     */
    void autoUpdateStatusAndRecheckQuantity(@Param("wavePickingCode")String wavePickingCode,@Param("groupCode") String groupCode);

    /**
     * 波次拣货确认，不需要复核操作时，自动更新出库单复核数量及状态
     *
     * @param outboundRegisterDTO
     */
    void autoUpdateRecheckQuantityByCodes(OutboundRegisterDTO outboundRegisterDTO);

    /**
     * 爆品复核时，根据出库登记的复核数量，更新同波次下的出库明细及出库单的复核数量
     * @param outboundRegisterDTO
     * @return
     */
    int hotReviewUpdateRecheckQuantity(OutboundRegisterDTO outboundRegisterDTO);

    /**
     * 波次拣货确认，不需要复核操作时，自动更新出库数量及状态
     * @param outboundCode 出库单code
     */
    void autoUpdateStatusAndSendQuantity(@Param("outboundCode")String outboundCode,@Param("groupCode") String groupCode);
    /**
     * 波次拣货确认，非奇门订单，不需要复核操作时，自动更新出库数量及状态
     * @param outboundCodes 订单号
     */
    void autoNoQimenUpdateStatusAndSendQuantity(@Param("codes")List<String> outboundCodes,@Param("groupCode") String groupCode);

    /**check
     * 汇总波次号下已复核订单数、商品总数、已复核数量、包裹数
     *
     * @param codes 出库单号
     */
    OutboundVO querySumInfo(@Param("codes")List<String> codes,@Param("groupCode") String groupCode);

    /**
     * 更新出库单的复核数量和状态
     * @author rfwang
     * @date 2021年7月16日
     *@param wavePickingCode 波次号
     */
    int updateRecheckQuantityByWavePickingCode(@Param("wavePickingCode")String wavePickingCode,@Param("groupCode") String groupCode);

    /**
     * 普通复核更新复核数量
     * @author liuxr
     * @date 2021/4/12 18:45
     * @param deliveryCode 发货单号
     * @param reviewCount 复核数量
     * @return int 更新条数
     */
    int reviewUpdateInfo(@Param("deliveryCode") String deliveryCode,@Param("reviewCount")  BigDecimal reviewCount,@Param("groupCode") String groupCode);

    /**
     * 批量更新复核数量
     * @author rfwang
     * @date 2021/12/20 20:12
     * @param outboundDTOList
     * @return
     */
    void batchRecheck(List<OutboundDTO> outboundDTOList);

    /**
     * 批量更新复核任务状态
     * @author rfwang
     * @date 2022/05/25 20:16
     * @param outboundCodes
     * @param groupCode
     * @param recheckTaskStatus
     * @return
     */
    void updateRecheckTaskStatus(@Param("outboundCodes") List<String> outboundCodes,@Param("groupCode") String groupCode,@Param("recheckTaskStatus")  String recheckTaskStatus);

}
